home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / g / gnu_c / pmlsrc23.zoo / pmlsrc / cerr.s < prev    next >
Encoding:
Text File  |  1994-03-19  |  2.0 KB  |  105 lines

  1. #APP
  2.  
  3. | mjr: complex error checking code
  4. |    inputs:
  5. |    a1:    pointer to double
  6. |    a7@(4):    pointer to funcname
  7.  
  8. .text
  9. .even
  10.  
  11. .globl c_err_check
  12. .even
  13.  
  14. c_err_check:
  15.     movew    a1@,d1        | get z.real
  16.     cmpiw    #0x7fff,d1    | == NaN ?
  17.     beq    error_nan    |
  18.     cmpiw    #0x7ff0,d1    | == + Infinity ?
  19.     beq    error_plus    |
  20.     cmpiw    #0xfff0,d1    | == - Infinity ?
  21.     beq    error_minus    |
  22. continue:
  23.     movew    a1@(8),d1    | get z.imag
  24.     cmpiw    #0x7fff,d1    | == NaN ?
  25.     beq    error_nan_i    |
  26.     cmpiw    #0x7ff0,d1    | == + Infinity ?
  27.     beq    error_plus_i    |
  28.     cmpiw    #0xfff0,d1    | == - Infinity ?
  29.     beq    error_minus_i    |
  30.  
  31.     addqw    #4,a7        | drop _funcname
  32.     rts
  33.  
  34. error_minus:
  35.     moveml    d0/a1,a7@-
  36.     movel    #63,_errno    | errno = ERANGE
  37.     pea    Overflow    | for printf
  38.     bra    error_exit    |
  39. error_plus:
  40.     moveml    d0/a1,a7@-
  41.     movel    #63,_errno    | NAN => errno = EDOM
  42.     pea    Overflow    | for printf
  43.     bra    error_exit    |
  44. error_nan:
  45.     moveml    d0/a1,a7@-
  46.     lea    __infinitydf,a0
  47.     movel    a0@,a1@        | result = + Infinity (for now)
  48.     movel    a0@(4),a1@(4)    | result = + Infinity (for now)
  49.     movel    #62,_errno    | NAN => errno = EDOM
  50.     pea    Domain        | for printf
  51. error_exit:
  52.     pea    __iob+52    |
  53.     jbsr    _fprintf    |
  54.     addqw    #8,a7        | leave _funcname on stack
  55.     moveml    a7@+,d0/a1
  56.     bra    continue
  57.  
  58. error_minus_i:
  59.     moveml    d0/a1,a7@-
  60.     movel    #63,_errno    | errno = ERANGE
  61.     pea    Overflow    | for printf
  62.     bra    error_exit_i    |
  63. error_plus_i:
  64.     moveml    d0/a1,a7@-
  65.     movel    #63,_errno    | NAN => errno = EDOM
  66.     pea    Overflow    | for printf
  67.     bra    error_exit_i    |
  68. error_nan_i:
  69.     moveml    d0/a1,a7@-
  70.     lea    __infinitydf,a0
  71.     movel    a0@,a1@(8)    | result = + Infinity (for now)
  72.     movel    a0@(4),a1@(12)    | result = + Infinity (for now)
  73.     movel    #62,_errno    | NAN => errno = EDOM
  74.     pea    Domain        | for printf
  75. error_exit_i:
  76.     pea    __iob+52    |
  77.     jbsr    _fprintf    |
  78.     addw    #12,a7        |
  79.     moveml    a7@+,d0/a1
  80.  
  81.     rts
  82. .data
  83. .even
  84. |double_max:
  85. |    .long    0x7fee42d1
  86. |    .long    0x30273b76
  87. |double_min:
  88. |    .long    0xffee42d1
  89. |    .long    0x30273b76
  90. |NaN:
  91. |    .long    0x7fffffff
  92. |    .long    0xffffffff
  93. |p_Inf:
  94. |    .long    0x7ff00000
  95. |    .long    0x00000000
  96. |m_Inf:
  97. |    .long    0xfff00000
  98. |    .long    0x00000000
  99. Overflow:
  100.     .ascii    ": Overflow\n\0"
  101.     .even
  102. Domain:
  103.     .ascii    ": Domain error\n\0"
  104.     .even
  105.